//
// Created by chenlei on 2/5/16.
//

#ifndef FASTFOOD_NETCLIENT_H
#define FASTFOOD_NETCLIENT_H

#include <muduo/net/TcpClient.h>

#include <muduo/base/Logging.h>
#include <muduo/base/Thread.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <boost/bind.hpp>
#include <utility>
#include <stdio.h>
#include <unistd.h>

using namespace muduo;
using namespace muduo::net;

/**
 * 基于muduo网络 客户端封装
 *
 * 封装心跳 ---- todo :每隔5s 没有长度 只有一个包头
 */
class NetClient {


public:

    /*
     * 构造函数
     */
    NetClient(EventLoop *loop,
              const InetAddress &serverAddr,
              const string &clientName, unsigned char linkSign);


    virtual ~NetClient();

/**
       *  初始化绑定服务
       */
    void start();


    /**
     * 链路发送接口 发送消息
     */
    void writeAndFlush(Buffer *buffer);


    /*
     * 消息解码器  ---  数据分发
     */
    void decode(const TcpConnectionPtr &conn, Buffer *buf, Timestamp time);


    /**
     *  断开网络
     */
    void disConnection();


private:
    /**
  * 网络连接成功回调
  */
    void onConnection(const TcpConnectionPtr &conn);


    /**
     * 测试解码消息
     */
    void test_decode_message(const TcpConnectionPtr &conn, Buffer *buf, Timestamp time);

    /***
     * 心跳发送 处理---- 登陆成功之后
     */
    void heart_beat();

    /**
     *  逻辑数据分发处理
     */
    void dispatcher();

private:
/**
     * 事件处理
     */
    EventLoop *eventLoop;

    /**
     * muduo 封装 网络客户端
     */
    TcpClient tcpClient;

    /**
     * 网络连接  ,用户数据发送
     */
    TcpConnectionPtr connectionPtr;


    /**
     * 链路号
     */
    unsigned char linkSign;



    /**用于逻辑处理线程*/
    pthread_mutex_t work_mutex;
    pthread_t work_pthread_t;

};


#endif //FASTFOOD_NETCLIENT_H
